package com.atguigu.gmall.mq.listener;

import com.atguigu.gmall.mq.config.DeadLetterMqConfig;
import com.atguigu.gmall.mq.config.DelayMqConfig;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.annotation.RabbitListeners;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * @Auther 赵乾坤
 * @Date 2021-01-08 21:15
 *  * 接收消息
 */
@Component

public class ConsumerMessage {

    //接收延迟消息 基于死信
    @RabbitListeners(value  ={
            @RabbitListener(queues = DeadLetterMqConfig.queue_dead_2),
            @RabbitListener(queues = DelayMqConfig.queue_delay_1),

    })
//    @RabbitListener(queues = DeadLetterMqConfig.queue_dead_2)
    public void receiverDeadLetterMessage(String msg, Channel channel, Message message) throws Exception {

        System.out.println("接收到延迟消息：" + msg);
        System.out.println("接收到的时间：" + new Date());
        //手动应答
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),
                false);

    }

  //接收消息
//    @RabbitHandler   //谁接受写在 ， 谁头上
  @RabbitListener(queues = "queue1") //消费者只写队列（可以写在类头上，可以写在方法上）
    public void receiverMessage(String msg, Channel channel, Message message) {



        try {
            System.out.println("接收到的消息：" + msg);
//            int i = 1/0;
            //手动应答
            //参数1： 消息标记
            //参数2： 是否将消息放回队列   true : 放回  false : 不放回
            //手动应答
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),
                    false);
        } catch (Exception e) {
//            e.printStackTrace();
            //重新来发  一次    二次 拒绝
            if (message.getMessageProperties().isRedelivered()) {
                //第二次发  重新发来 、、拒绝接收
                try {
                    System.out.println("拒绝接收");
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),
                            false);
//            第一个参数拒绝摸个消息的标记    第二个参数 是否放回队列
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            } else {
                //第一次发
                try {
                    System.out.println("第一次发：可以再发一次");
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,true);
                    //1.消息的标记  2.是否批量  3.是否放回队列
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

}
